// SelectedContainer.h
// Created by Limou on 24-9-13.
// 描述了一个已选好友可选列表滚动区域

#ifndef FRONTEND_SELECTEDCONTAINER_HPP
#define FRONTEND_SELECTEDCONTAINER_HPP

#include <vector>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include "Container.hpp"
#include "../../common/Common.hpp"
#include "../Toast/Toast.hpp"

// >>> class SelectedContainer begin: 描述已选好友区域的部件 >>>
namespace chat_system::subassembly::ChooseFriendDialog {
    class SelectedContainer : public QWidget {
        Q_OBJECT
    private:
        QLabel* selectedFriendLab_; // "已选好友" 标签部件
        Container* container_; // 滚动区域部件
        QPushButton* finishBtn_; // 完成按钮部件
        QPushButton* cancelBtn_; // 取消按钮部件

    public:
        // 构造方法
        explicit SelectedContainer(QWidget* parent = nullptr)
            : QWidget(parent)
            , selectedFriendLab_(new QLabel(this))
            , container_(new Container(this))
            , finishBtn_(new QPushButton(this))
            , cancelBtn_(new QPushButton(this)) {
            this->setElement(); // 设置组件
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置信号槽
        }

        // 析构方法
        ~SelectedContainer() override = default;

        // 获取滚动区域方法(方便其他组件插入子项)
        Container* getContainer() {
            return container_;
        }

    private:
        // 设置组件样式方法
        void setElement() {
            QSize btnSize(80, 30);
            this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
            selectedFriendLab_->setText("已选好友");
            finishBtn_->setFixedSize(btnSize);
            finishBtn_->setText("创建群聊");
            cancelBtn_->setFixedSize(btnSize);
            cancelBtn_->setText("取消创建");
        }

        // 设置组件样式方法
        void setElementStyle() {
            // 提前定义标签按钮样式
            QString labelStyleSheet =
                    "QLabel {"
                    "color: black;"
                    "border: none;"
                    "background-color: transparent;"
                    "font-size: 15px;"
                    "}";

            // 提前定义完成按钮样式
            QString finishBtnStyleSheet =
                    "QPushButton {" // 默认时
                    "color: white;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(7, 193, 96);"
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {" // 鼠标悬停时
                    "background-color: rgb(56, 205, 127);"
                    "}"
                    "QPushButton:pressed {" // 鼠标按下时
                    "background-color: rgb(6, 173, 86);"
                    "}";

            // 提前定义取消按钮样式
            QString cancelBtnStyleSheet =
                    "QPushButton {" // 默认时
                    "color: green;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(243, 243, 243);"
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {" // 鼠标悬停时
                    "background-color: rgb(219, 219, 219);"
                    "}"
                    "QPushButton:pressed {" // 鼠标按下时
                    "background-color: rgb(206, 206, 206);"
                    "}";

            // 设置本部件
            this->setStyleSheet(
                    "QWidget {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
            );

            selectedFriendLab_->setStyleSheet(labelStyleSheet);
            finishBtn_->setStyleSheet(finishBtnStyleSheet);
            cancelBtn_->setStyleSheet(cancelBtnStyleSheet);
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 设置布局管理器
            auto selectedContainerLayout = new QVBoxLayout();

            selectedContainerLayout->setSpacing(20);
            selectedContainerLayout->setContentsMargins(0, 0, 0, 0);

            selectedContainerLayout->addWidget(selectedFriendLab_, 0, Qt::AlignLeft);
            selectedContainerLayout->addWidget(container_, 0, Qt::AlignCenter);

            auto btnLayout = new QHBoxLayout();
            btnLayout->setSpacing(0);
            btnLayout->setContentsMargins(0, 0, 0, 0);
            btnLayout->addWidget(finishBtn_, 0, Qt::AlignCenter);
            btnLayout->addWidget(cancelBtn_, 0, Qt::AlignCenter);

            selectedContainerLayout->addLayout(btnLayout);
            this->setLayout(selectedContainerLayout);
        }

        // 设置信号槽方法
        void setElementSignalSlot() {
            connect(finishBtn_, &QPushButton::clicked, this, [this]() {
                common::Tools::getInstance()->getLogger()->trace("{0} {1} finishBtn_ is clicked", __FILE__, __LINE__);

                // 获取布局管理器
                auto layout = qobject_cast<QVBoxLayout*>(container_->getOriginalContainer()->layout());
                if (layout == nullptr) {
                    common::Tools::getInstance()->getLogger()->error("{0} {1} layout pointer is null", __FILE__, __LINE__);
                    return;
                }

                // 搜集用户信息
                std::vector<model::UserModel> users;
                for (int i = 0; i < layout->count(); ++i) { // 遍历每一个子项
                    QLayoutItem* item = layout->itemAt(i); // 得到每一个布局子项
                    QWidget* widget = item->widget(); // 得到每一个具体子项, 我希望转化为 ContainerItem
                    // 尝试将 QWidget 转换为 ContainerItem
                    if (ContainerItem* containerItem = qobject_cast<ContainerItem*>(widget)) {
                        // 处理每个 ContainerItem，例如打印名称或其他操作
                        users.push_back(containerItem->getUser());
                    }
                }

                // 禁止小于 3 人的群聊
                if (users.size() < 3) {
                    common::Tools::getInstance()->getLogger()->trace("{0} {1} users size is less than 3", __FILE__, __LINE__);
                    Toast::showErrorMessage("群聊人数不得小于 3 人");
                    return;
                }

                // 禁止超过 30 人的群聊 TODO: 避免服务器压力先这么多
                if (users.size() > 30) {
                    common::Tools::getInstance()->getLogger()->trace("{0} {1} users size is more than 30", __FILE__, __LINE__);
                    Toast::showErrorMessage("群聊人数不得超过 30 人");
                    return;
                }

                // TODO: 发送群聊创建请求
                common::Tools::getInstance()->getLogger()->trace("{0} {1} send group chat create request", __FILE__, __LINE__);
                // TODO: 这里已经有一个 users 列表数据可以提供给后端代码了, 可能需要转化为 JSON 到时候再说...
                // TODO: 发送信号提醒组间更新
            });
            connect(cancelBtn_, &QPushButton::clicked, this, [this]() {
                common::Tools::getInstance()->getLogger()->trace("{0} {1} cancelBtn_ is clicked", __FILE__, __LINE__);
            });
        }
    };
}
// <<< class SelectedContainer end <<<

#endif //FRONTEND_SELECTEDCONTAINER_HPP
